package com.niit.base

object Base_10 {

  def main(args: Array[String]): Unit = {
    /*
    模式匹配：
     1.简单的模式匹配
     2.匹配类型
     3.模式匹配的守卫
     4.匹配样例类
     5.匹配集合
     6.变量声明中的模式匹配
     7.匹配for循环表达式
     */
    //1.简单的模式匹配 switch(str) - case
    //需求：输入 Hadoop或Spark，分别显示两者的简介信息，如果输入其他则显示未匹配
    var str = "Hbase"
    var res = str match {
      case "Hadoop" => "大数据分布式存储和计算框架"
      case "Spark" => "大数据分布式内存计算框架"
      case _ => "未匹配"
    }
    println(res)
    //2.匹配类型
    val i:Any =999
    i match {
      case i:String => println("这是字符串")
      case _:Int => println("这是一个整型")// 已经case后面的变量名是固定的，所以可以使用_来占位
      case _:Double => println("这是一个小数")
      case _=> println("未匹配")
    }
    //3.模式匹配的守卫
    //输入一个数，获得这个数所在的区间
    var num = 3
    num match {
      case num if num>=0 && num<=10 => println("这数在0-10的范围")
      case num if num>11 && num <=20 => println("这数在11-20的范围")
      case _=> println("未匹配")
    }
    //4.匹配样例类
    // 1.样例类型后的小括号中，编写的字段个数要和该样例类的字段个数保持一直
    // 2.通过match进行模式匹配的时候，要匹配的对象类型必须Any
    var c:Any = Customer("张三",18)
    var o:Any = Order(123456)
    var arr:Any = Array(1,2)
    arr match {
      case Customer(a,b) => println("Customer类")
      case Order(c)=> println("Order")
      case _=>println("未匹配")
    }
    //5.1匹配集合之 数组
    var arr1 = Array(1,2,3)
    var arr2 = Array(0)
    var arr3 = Array(1,2,3,4,5)
    arr3 match {
      //匹配：长度为3 首元素为 1
      case Array(1,x,y) => println("长度为3 首元素为 1 ")
      //匹配:只有一个元素 且为0
      case Array(0) => println("只有一个元素 且为0")
      //匹配：首元素1后边元素无所谓
      case Array(1,_*) => println("首元素1后边元素无所谓")
      case _=>println("未匹配")
    }
    //5.2匹配集合之 列表
    var list1 = List(0)
    var list2 = List(0,1,2,3,4,5)
    var list3 = List(1,2)
    list3 match {
      //匹配:只有一个元素 且为0
      case List(0) => println("只有一个元素 且为0 ")
      //匹配:首元素0后边元素无所谓
      case List(0,_*) => println("首元素0后边元素无所谓")
      //匹配：只有两个元素的列表
      case List(x,y) => println("只有两个元素的列表")
      case _ => println("未匹配")
    }
    //list 关键字符的表达式
    list3 match {
      //匹配:只有一个元素 且为0
      case 0::Nil => println("只有一个元素 且为0 ")
      //匹配:首元素0后边元素无所谓
      case 0::tail => println("首元素0后边元素无所谓")
      //匹配：只有两个元素的列表
      case x::y::Nil => println("只有两个元素的列表")
      case _ => println("未匹配")
    }

    //6.变量声明中的模式匹配
     //生成要给1-10的数组，去获得 第二 三 四元素
    var arr4 = (1 to 10).toArray
    val Array(_,x,y,z,_*) =arr4
    println(x,y,z)
    //生成一个1-10的列表，去获得第一 二元素
    var list4 = (1 to 10).toList
    //方式一
    var List(a,b,_*) = list4
    println(a,b)
    //方式二
    var n::m::tail = list4
    println(n,m)
    //7.匹配for表达式
    // 定义变量记录学生的姓名和年龄，获得年龄为23的学生信息
    var map1 = Map("张三"->23,"李四"->24,"王五"->25)
    //传统方式的写法
    for ( (k,v) <- map1 if v==23){
      println(k,v)
    }
    //固定值方式
    for( (k,23) <- map1){
      println(k,23)
    }

    /*
    Options类型，在实际开发中，难免会出现空指针，在Scala中可以通过Options类型去避免空指针，
     Options有两个可选择值
        Some：表示实际值
        None：表示没有值
     */

    var p= 10
    var u = 0;
    var r = div(p,u)
    println(r)


  }
  def div(a:Int,b:Int) = {
    if(b == 0){
       None
    }else{
      Some(a / b)
    }
  }

  case class Customer(var name:String,var age:Int)
  case class Order(var id:Int)

}
